
{
	// mo1.js
	// 1- 在模块mo1.js中直接定义的常量或变量拥有自己的作用域，在其它文件中不可以直接调用。
	// 2- 引入模块需要通过require函数来引入,使用该函数时需要传递引入模块的文件地址
	// 3- 引入的模块地址相对的是当前js文件所在的目录，与NODE执行目录无关。
	// 4- 如果引入的模块没有导出任何数据，那么得到的是一介空的对象。
	// console.log(require("./modules/mo1.js"));// {}
	// const mo1 = require("./modules/mo1.js");
	// console.log(mo1);// {}
	// console.log(a);//  a is not defined
}
{
	// 1- 在模块中可以通过module.exports导出数据
	// 2- 在模块中的this的引用地址与module.exports相同
	// 3- 通过require引入模块后得到的数据其实是引入模块中的module.exports
	// mo2.js
	// const mo2 = require("./modules/mo2.js");
	// // console.log(mo2);//{ a: 1, b: 2, fn: [Function (anonymous)] }
	// mo2.fn();
}
{
	// const mo3 = require("./modules/mo3.js");
	// // console.log(mo3.a,mo3.b,mo3.c);// 1 2 3
	// // mo3.fn();
	// mo3.fn2();
	// // mo3.fn4();
}
{
	// const mo4 = require("./modules/mo4.js");
	// console.log(mo4.a,mo4.b,mo4.c);// 1 2 3
	
	// const {a,b,c,fn} = require("./modules/mo4.js");
	// console.log(a,b,c);// 1 2 3
	// fn();
	
}
{
	// 永远记住：引入的模块的值永远都是该模块中的module.exports
	// const mo5 = require("./modules/mo5.js");
	// console.log(mo5);
}
{
	// // 可以支持引入JSON文件，会将JSON文件中的数据转为对象
	// const mo6 = require("./modules/mo6.json");
	// console.log(mo6);
}
{
	// 扩展名.js,.json可以省略
	// 如果js,json文件名字相同，那么js文件优先
	// const mo7= require("./modules/mo7");
	// const mo7= require("./modules/mo7");
	// console.log(mo7);
}
{
	// 如果引入的模块名字为index.js,那么index.js可以省略
	// modules/mo8查找模块的规则：
	// 1- 先去modules目录中查找文件名mo8.js
	// 2- 再去modules目录中查找文件名mo8.json
	// 3- 最后去modules目录中查找文件名mo8目录下的index.js
	// 注意：目录中的默认文件可以通过配置package.json中的main属性来更改
	// const mo8 = require("./modules/mo8");
	// console.log(mo8);
}
{
	// 1- 先去node_modules目录下找mo9.js
	// 2- 先去node_modules目录下找mo9.json
	// 3- 先去node_modules目录下找mo9目录
	// 4- 注意：如果当前目录中没有node_modules目录，那么去上一层找。
	// const mo9 = require("mo9");
	// console.log(mo9);
}
{
	// 只有第一次引入该模块时才会执行，且会将该模块暴露出来的数据进行缓存。当你第二次引入时会从缓存中提取数据。
	const mo10 = require("./modules/mo10");
	const mo101 = require("./modules/mo10");
	console.log(mo10 === mo101);
	mo10.a = 200;
	console.log(mo10.a, mo101.a);// 200 200
}